<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2019-03-03
 * Time: 14:11
 */

/**
 * 在一个协程中使用go嵌套创建新的协程，这个场景下
 * 使用go创建的子协程会优先执行，子协程执行完毕或挂起时，将重新回到父协程向下执行代码
 * 如果子协程挂起后，父协程退出，不影响子协程的执行
 */

function testYield1()
{
    echo "co 1 start\n";
    //让出执行权
    co::yield();
    echo "co 1 end\n";
}

//协程创建成功返回cid
$cid = go ('testYield1');
go (function() use ($cid)
{
    echo "co 2 start\n";
    //协程的sleep是协程调度器实现的，底层会yield当前协程，让出时间片，并添加一个异步定时器，当超时时间到达时重新resume当前协程，恢复运行
    co::sleep(0.5);
    co::resume($cid);
    echo "co 2 end\n";
});

/**
 * 以上结果输出为：
 * co 1 start
 * co 2 start
 * co 1 end
 * co 2 end
 */